package com.hxzy.module.admin.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hxzy.framework.common.exception.ApiException;
import com.hxzy.framework.common.resp.R;
import com.hxzy.framework.common.util.ResultUtil;
import com.hxzy.framework.common.util.RsaUtils;
import com.hxzy.framework.web.util.WebFrameworkUtils;
import com.hxzy.module.admin.api.account.req.AccountListReq;
import com.hxzy.module.admin.api.account.req.AdminAccountResp;
import com.hxzy.module.admin.api.account.resp.AccountDetailResp;
import com.hxzy.module.admin.api.account.resp.AdminAccountListResp;
import com.hxzy.module.admin.api.account.resp.LoadUserResp;
import com.hxzy.module.admin.api.modules.resp.ModuleResp;
import com.hxzy.module.admin.api.role.resp.AdminRoleResp;
import com.hxzy.module.admin.entity.AdminAccount;
import com.hxzy.module.admin.entity.AdminModule;
import com.hxzy.module.admin.properties.RSAProperties;
import com.hxzy.module.admin.service.AdminAccountService;
import com.hxzy.module.admin.mapper.AdminAccountMapper;
import com.hxzy.module.admin.service.AdminModuleService;
import com.hxzy.module.merchant.api.merchant.MerchantFeignApi;
import com.hxzy.module.merchant.api.merchant.resp.MerchantResp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
* @author 11452
* @description 针对表【admin_account(总部账户表)】的数据库操作Service实现
* @createDate 2024-01-28 10:57:27
*/
@Service
public class AdminAccountServiceImpl extends ServiceImpl<AdminAccountMapper, AdminAccount>
    implements AdminAccountService{

    /**
     * 项目中配置的非对称加密属性
     */
    @Autowired
    private RSAProperties  rsaProperties;


    /**
     * 管理员菜单表
     */
    @Autowired
    private AdminModuleService adminModuleService;


    /**
     * 获取当前用户信息
     * @param accountId
     * @return
     */
    @Override
    public LoadUserResp loadUser(Long accountId) {
        Long merchantId = WebFrameworkUtils.getMerchantId();

        //根据账号查询信息及角色信息   admin_account , admin_account_inner_role , admin_role 表左外链接
        LoadUserResp resp= this.baseMapper.findAccountAndRoleByAccountId(accountId,merchantId);
        if (ObjectUtil.isEmpty(resp)) {
            throw new ApiException(500, "账号不存在");
        }
        //再根据角色ID查询 它拥有的菜单权限,并且使用商户购买的版本
        //商户版本 1：标准版，2：专业版 3：高级版 4：旗舰版  充用
         //this.adminModuleService.findModuleByRoleId(resp.getRoleId(),merchantResp.getTypenoInt());

        //修改为根据角色查询菜单  admin_role_inner_module  left    admin_menu  left  admin_module
        List<AdminModule> adminModuleList=this.adminModuleService.findByAdminModuleList(resp.getRoleId(),merchantId);
        if(adminModuleList.size()>0){
            //重新构造前端需要的菜单
            List<ModuleResp> moduleRespList = new ArrayList<>();

            //循环一级根节点
            adminModuleList.stream().filter(p->p.getPid().equals(0L)).forEach(p-> {
                //自定义根节点
                ModuleResp parentModuleResp=convert(p);
                //查询第二级节点
                List<ModuleResp>  childRenModuleList = new ArrayList<>();
                adminModuleList.stream().filter(v-> (!v.getPid().equals(0L)) && v.getPid().equals(parentModuleResp.getModuleId()))
                        .forEach(s-> {
                            ModuleResp child=convert(s);
                            childRenModuleList.add(child);
                        });
                //二级菜单有值
                if(childRenModuleList.size()>0){
                    parentModuleResp.setModules(childRenModuleList);
                }
                //添加到最终返回的结果
                moduleRespList.add(parentModuleResp);
            });


            //放到自定义输出菜单中
            resp.setModules(moduleRespList);
        }

        return resp;
    }

    /**
     * 根据角色ID查询账户信息
     * @param roleId
     * @return
     */
    @Override
    public List<AdminAccountResp> findByRoleId(Long roleId) {
        Long merchantId = WebFrameworkUtils.getMerchantId();
        List<AdminAccountResp> list=this.baseMapper.findByRoleId(roleId,merchantId);
        return list;
    }

    /**
     * 账户信息查询
     * @param req
     * @return
     */
    @Override
    public PageInfo<AdminAccountListResp> accountList(AccountListReq req) {
        //admin_account   admin_account_inner_role   admin_role    表关联
        Long merchantId = WebFrameworkUtils.getMerchantId();
        return PageHelper.startPage(req.getPageNum(),req.getPageSize())
                .doSelectPageInfo(()->{
                    this.baseMapper.accountList(req,merchantId);
                });
    }

    /**
     * 帐号详情
     * @param accountId
     * @return
     */
    @Override
    public AccountDetailResp accountDetail(Long accountId) {
        Long merchantId = WebFrameworkUtils.getMerchantId();
        LoadUserResp loadUserResp = this.baseMapper.findAccountAndRoleByAccountId(accountId, merchantId);
        if (ObjectUtil.isEmpty(loadUserResp)) {
            throw new ApiException(500, "账号不存在");
        }

        AccountDetailResp resp = new AccountDetailResp();
        resp.setAccountId(loadUserResp.getId());
        resp.setName(loadUserResp.getName());
        resp.setPhone(loadUserResp.getPhone());
        resp.setAccount(loadUserResp.getAccount());
        resp.setPwd(RsaUtils.pubDec(loadUserResp.getPwd(), rsaProperties.getPrivateKeyStr(), rsaProperties.getPublicKeyStr()));
        resp.setRoleId(loadUserResp.getRoleId());
        resp.setRoleName(loadUserResp.getRoleName());
        resp.setSub(loadUserResp.getSub());
        return resp;
    }

    /**
     * 自定义转换类
     * @param module
     * @return
     */
    private ModuleResp    convert(AdminModule  module){
        ModuleResp  moduleResp=new ModuleResp();
        moduleResp.setModuleId(module.getId());
        moduleResp.setPid(module.getPid());
        moduleResp.setIcon(module.getIcon());
        moduleResp.setName(module.getName());
        moduleResp.setSort(module.getSort());
        moduleResp.setUrl(module.getUrl());
        moduleResp.setShowUrl(module.getShowUrl());
        moduleResp.setActiveMenu(module.getActiveMenu());
        moduleResp.setApiUrl(module.getApiUrl());
        return moduleResp;
    }
}




